<?php

namespace App\Services\Netease;

class ChatServices extends BaseServices
{
    /**
     * 发送普通消息
     * @param  $from    发送者accid
     * @param  $ope 0：点对点个人消息，1：群消息（高级群），其他返回414
     * @param  $to      ope==0是表示accid即用户id，ope==1表示tid即群id
     * @return $type    消息类型 0 表示文本消息, 1 表示图片，2 表示语音，3 表示视频，4 表示地理位置信息，6 表示文件，10 表示提示消息，100 自定义消息类型
     * @return $body    最大长度5000字符，JSON格式
     * @return $option  发消息时特殊指定的行为选项,JSON格式
     * @return $pushcontent  推送文案,最长500个字符
     * @return $payload  必须是JSON,不能超过2k字符
     * @return $ext  开发者扩展字段，长度限制1024字符
     */
    public function sendMessage($from, $ope, $to, $types, $body, $option = '', $pushcontent = '', $payload = '', $ext = '')
    {
        $url = $this->url . 'msg/sendMsg.action';
        $data = [];
        $data['from'] = $from;
        $data['ope'] = $ope;
        $data['to'] = $to;
        $data['type'] = $types;
        $data['body'] = json_encode($body);
        $result = $this->postDataCurl($url, $data);
        return resultNeteaseInfo($result);
    }

    /**
     * 消息功能-发送自定义系统消息
     * 1.自定义系统通知区别于普通消息，方便开发者进行业务逻辑的通知。
     * 2.目前支持两种类型：点对点类型和群类型（仅限高级群），根据msgType有所区别。
     * @param  $from [发送者accid，用户帐号，最大32字节，APP内唯一]
     * @param  $msgtype [0：点对点个人消息，1：群消息，其他返回414]
     * @param  $to [msgtype==0是表示accid，msgtype==1表示tid]
     * @param  $attach [自定义通知内容，第三方组装的字符串，建议是JSON串，最大长度1024字节]
     * @param  $pushcontent [ios推送内容，第三方自己组装的推送内容，如果此属性为空串，自定义通知将不会有推送（pushcontent + payload不能超过200字节）]
     * @param  $payload [ios 推送对应的payload,必须是JSON（pushcontent + payload不能超过200字节）]
     * @param  $sound [如果有指定推送，此属性指定为客户端本地的声音文件名，长度不要超过30个字节，如果不指定，会使用默认声音]
     * @return $result      [返回array数组对象]
     */
    public function sendAttachMsg($from, $msgtype, $to, $attach, $pushcontent = '', $payload = array(), $sound = '')
    {
        if (empty($from) || empty($to) || empty($attach)) {
            return false;
        }
        $url = $this->url . 'msg/sendAttachMsg.action';
        $data = array(
            'from' => $from,
            'msgtype' => $msgtype,
            'to' => $to,
            'attach' => $attach,
            'pushcontent' => $pushcontent,
//            'payload' => json_encode($payload),
            'sound' => $sound
        );
        $result = $this->postDataCurl($url, $data);
        return resultNeteaseInfo($result);
    }

    /**
     * 消息功能-文件上传
     * @param  $content [字节流base64串(Base64.encode(bytes)) ，最大15M的字节流]
     * @param  $type [上传文件类型]
     * @return $result      [返回array数组对象]
     */
    public function uploadMsg($content, $types = '0')
    {
        if (empty($content)) {
            return false;
        }
        $url = $this->url . 'msg/upload.action';
        $data = array(
            'content' => $content,
            'type' => $types
        );
        $result = $this->postDataCurl($url, $data);
        return resultNeteaseInfo($result);
    }

    /**
     * 消息功能-文件上传（multipart方式）
     * @param  $content [字节流base64串(Base64.encode(bytes)) ，最大15M的字节流]
     * @param  $type [上传文件类型]
     * @return $result      [返回array数组对象]
     */
    public function uploadMultiMsg($content, $types = '0')
    {
        if (empty($content)) {
            return false;
        }
        $url = $this->url . 'msg/fileUpload.action';
        $data = array(
            'content' => $content,
            'type' => $types
        );
        $result = $this->postDataCurl($url, $data);
        return resultNeteaseInfo($result);
    }

    /**
     * 消息撤回
     * @param  $deleteMsgid [要撤回消息的msgid]
     * @param  $types [7:表示点对点消息撤回，8:表示群消息撤回，其它为参数错误]
     * @param  $from [发消息的accid]
     * @param  $to [如果点对点消息，为接收消息的accid,如果群消息，为对应群的tid]
     * @param  $timetag [要撤回消息的创建时间]  发送消息返回的消息时间
     * @return $result      [返回array数组对象]
     */
    public function recallMsg($deleteMsgid, $types = '7', $from, $to, $timetag)
    {
        if (empty($deleteMsgid) || empty($from) || empty($to)) {
            return false;
        }
        $url = $this->url . 'msg/recall.action';
        $data = array(
            'deleteMsgid' => $deleteMsgid,
            'timetag' => $timetag,
            'type' => $types,
            'from' => $from,
            'to' => $to
        );
        $result = $this->postDataCurl($url, $data);
        return resultNeteaseInfo($result);
    }

    /**
     * 发送广播消息 ****需申请开通****
     * @param  $body [广播消息内容，最大4096字符]
     * @return $result      [返回array数组对象]
     */
    public function broadcastMsg($body)
    {
        if (empty($body)) {
            return false;
        }
        $url = $this->url . 'msg/broadcastMsg.action';
        $data = array(
            'body' => $body,
        );
        $result = $this->postDataCurl($url, $data);
        return resultNeteaseInfo($result);
    }

    /**
     * 单向撤回消息
     * @param  $deleteMsgid [要撤回消息的msgid]
     * @param  $types 13:表示点对点消息撤回，14:表示群消息撤回，其它为参数错误
     * @param  $from [发消息的accid]
     * @param  $to [如果点对点消息，为接收消息的accid,如果群消息，为对应群的tid]
     * @param  $timetag [要撤回消息的创建时间]  发送消息返回的消息时间
     * @return $result      [返回array数组对象]
     */
    public function delMsgOneWayMsg($deleteMsgid, $types = '13', $from, $to, $timetag)
    {
        if (empty($deleteMsgid) || empty($from) || empty($to)) {
            return false;
        }
        $url = $this->url . 'msg/delMsgOneWay.action';
        $data = array(
            'deleteMsgid' => $deleteMsgid,
            'timetag' => $timetag,
            'type' => $types,
            'from' => $from,
            'to' => $to
        );
        $result = $this->postDataCurl($url, $data);
        return resultNeteaseInfo($result);
    }

    /**
     * 删除会话漫游
     * @param  $type      会话类型，1-p2p会话，2-群会话，其他返回414
     * @param  $from     发送者accid, 用户帐号，最大长度32字节
     * @param  $to      type=1表示对端accid，type=2表示tid
     * @return $result      [返回array数组对象]
     */
    public function delRoamSessionMsg($types = '1', $from, $to)
    {
        if (empty($types) || empty($from) || empty($to)) {
            return false;
        }
        $url = $this->url . 'msg/delRoamSession.action';
        $data = array(
            'type' => $types,
            'from' => $from,
            'to' => $to
        );
        $result = $this->postDataCurl($url, $data);
        return resultNeteaseInfo($result);
    }


    /**
     * 历史记录-单聊
     * @param  $from       [发送者accid]
     * @param  $to         [接收者accid]
     * @param  $begintime  [开始时间，ms 13位时间戳]
     * @param  $endtime    [截止时间，ms 13位时间戳]
     * @param  $limit      [本次查询的消息条数上限(最多100条),小于等于0，或者大于100，会提示参数错误]
     * @param  $reverse    [1按时间正序排列，2按时间降序排列。其它返回参数414.默认是按降序排列。]
     * 从开始时间 到结束时间，不限定时间的查询范围，最多查询100条记录
     * @return $result     [返回array数组对象]
     */
    public function querySessionMsg($from,$to,$begintime,$endtime='',$limit='100',$reverse='1'){
        $url = $this->url . 'history/querySessionMsg.action';
        $data= array(
            'from'      => $from,
            'to'        => $to,
            'begintime' => $begintime,
            'endtime'   => $endtime,
            'limit'     => $limit,
            'reverse'   => $reverse
        );
        $result = $this->postDataCurl($url, $data);
        return resultNeteaseInfo($result);
    }

    /**
     * 历史记录-群聊
     * @param  $tid       [群id]
     * @param  $accid          [查询用户对应的accid.]
     * @param  $begintime     [开始时间，ms]
     * @param  $endtime     [截止时间，ms]
     * @param  $limit       [本次查询的消息条数上限(最多100条),小于等于0，或者大于100，会提示参数错误]
     * @param  $reverse    [1按时间正序排列，2按时间降序排列。其它返回参数414.默认是按降序排列。]
     * @return $result      [返回array数组对象]
     */
    public function queryGroupMsg($tid,$accid,$begintime,$endtime='',$limit='100',$reverse='1'){
        $url = $this->url . 'history/queryTeamMsg.action';
        $data= array(
            'tid' => $tid,
            'accid' => $accid,
            'begintime' => $begintime,
            'endtime' => $endtime,
            'limit' => $limit,
            'reverse' => $reverse
        );
        $result = $this->postDataCurl($url, $data);
        return resultNeteaseInfo($result);
    }


}
